import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2022-05-10
 * Time: 13:13
 */
public class Test {
    public static void reverse(int[] arr){
        int low = 0;//左边
        int hight = arr.length-1;//右边
        while(low<=hight){//能交换必须满足的条件
            int tmp = arr[low];
            arr[low]=arr[hight];
            arr[hight]=tmp;
            low++;
            hight--;
        }
    }
    public static void main(String[] args) {
        int[] arr= {1,2,3,4,5,6,7,8,9};
        reverse(arr);
        System.out.println(Arrays.toString(arr));
    }
    //冒泡排序
    public static void bubblesort(int[] arr){
        for (int i = 0; i < arr.length-1; i++) {//假设有n个元素，由于每排完一趟都会使一个最大的数字在最高位，因此只用排n-1趟，剩下的一个数字自然在最低位了
            boolean flg = false;//定义flg作为标志，来判断是否还要进行下一趟排序，提高效率
            for (int j = 0; j < arr.length-1-i; j++) {//因为每排一趟都会使一个数字到高位置，因此每一趟都会比上一趟少一个数字，所以-i
                if (arr[j] > arr[j+1]){//if条件满足则该趟进行了交换
                    flg =true;//flg=true我们认为该趟发生排序交换
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1]=tmp;
                }
            }
            if(flg == false){//如果flg=false,就说明该趟没有满足if条件，即没有发生排序，所以所有的数字都已经排好了，因此不用再进行下一趟排序了
                return ;
            }
        }
    }
    public static void main6(String[] args) {
        int[] arr= {1,5,6,8,7,10,3,2,4,9};
        //bubblesort(arr);//void类型，直接传引用
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    //二分查找 有序
    public static int binarySearch(int[] arr,int key){
        int low = 0;//左下标
        int hight = arr.length-1;//右下标，因为数组下标从零开始，所以-1
        while(low<=hight){//因为是有序查找，所以当low<=hight才有可能找到
            int mid =(low + hight)/2;//折半
            if(key == arr[mid]){//arr[mid]==key
                return mid;//返回mid下标
            }else if(arr[mid] < key){//arr[mid]<key
                low = mid+1;//左边折去
            }else{//arr[mid]>key
                hight = mid-1;//折去右边
            }
        }
        //low>hight 该数组已经查找完毕，无法找到key
        return -1;//返回-1
    }
    //顺序查找
    public static int findkey(int[] arr, int key){
        for (int i = 0; i < arr.length; i++) {//循环遍历
            if(arr[i] == key){//找到了 返回下标
                return i;
            }
        }
        return -1;//没找到返回-1
    }
    public static void main5(String[] args) {
        int[] arr = {1,2,3,4,5,6,7};//创建一个数组
        int k = 13;//要查找的关键字k
        //int ret = findkey(arr,k);//传参 数组名、待查找的元素
//        int ret = binarySearch(arr,k);//传参 数组名、待查找的元素
        int ret = Arrays.binarySearch(arr,k);//使用Arrays.binarySearch提供的工具包
        System.out.println(ret);
    }
    //求数组的平均值
    public static double avg (int[] arr){
        double sum = 0;//平均值可能为小数，所以使用double类型
        for (int x:arr) {//for each求和
            sum+=x;
        }
        return(sum/arr.length);

    }
    public static void main4(String[] args) {
        int[] arr = {1,2,3,4,5};
        System.out.println(avg(arr));//链式访问，avg的返回值作为sout的参数
    }
    //浅拷贝
    public static void main3(String[] args) {
    }
    //深拷贝
    public static void main1(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = Arrays.copyOf(arr,arr.length);//使用Arrays.copyOf来实现拷贝
        System.out.println("=======拷贝后=======");
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(copy));
        System.out.println("=======修改后=======");
        copy[0]=100;//修改拷贝后的值
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(copy));
    }
}
